package main

import (
	"fmt"
	_ "time"
)

func main() {
	// 条件语句
	// Go语言的条件语句有 if-else 和 switch 两种。
	// if-else 语句
	// if 语句的一般形式为：
	// if 条件表达式 {
	//     语句
	// } else {
	//     语句
	// }
	// 条件表达式是一个布尔表达式，如果它的值为 true，则执行 if 语句块中的语句；否则，执行 else 语句块中的语句。

	// 以下是一个简单的示例：
	if 7 > 5 {
		fmt.Println("7 is greater than 5")
	} else {
		fmt.Println("7 is not greater than 5")
	}

	// switch 语句
	// switch 语句的一般形式为：
	// switch 表达式 {
	//     case 值1:
	//         语句
	//     case 值2:
	//         语句
	//     default:
	//         语句
	// }
	// 表达式可以是任意类型，但一般情况下，表达式是一个比较表达式（如 ==、!=、<、>、<=、>=）。
	// case 语句块中的语句将在表达式与该 case 值相匹配时执行。
	// 如果没有匹配的 case 值，则执行 default 语句块中的语句。

	// 以下是一个简单的示例：
	switch num := 9; num {
	case 7:
		fmt.Println("num is 7")
	case 8, 9:
		fmt.Println("num is 8 or 9")
	default:
		fmt.Println("num is not 7, 8, or 9")
	}

	// select 语句
	// select 语句用于在多个通道操作上进行选择。
	// select 语句的一般形式为：
	// select {
	//     case c <- x:
	//         语句
	//     case <-c:
	//         语句
	//     default:
	//         语句
	// }
	// 其中，c 是通信的管道，x 是要发送的值。
	// 如果 c 已经准备好接收，则执行 case c <- x 语句块中的语句。
	// 如果 c 已经有值，则执行 case <-c 语句块中的语句。
	// 如果以上都不满足，则执行 default 语句块中的语句。

	// 以下是一个简单的示例：
	ch1 := make(chan string)
	ch2 := make(chan string)
	// 启动两个 goroutine，分别从两个通道中获取数据
	go func() {
		for {
			ch1 <- "from 1"
		}
	}()
	go func() {
		for {
			ch2 <- "from 2"
		}
	}()

	// 使用 select 语句非阻塞地从两个通道中获取数据
	for {
		select {
			case msg1 := <-ch1:
				fmt.Println(msg1)
			case msg2 := <-ch2:
				fmt.Println(msg2)
			default:
				// 如果两个通道都没有可用的数据，则执行这里的语句
				fmt.Println("no message received")
		}
	}
}